/* 작성자 : Jint
 * 작성일 : 140508
 * 기존 File Backup System내용 :
 *  ProductMain 에서 쓰이는 사원 관리용 Thread 입니다.
 * 	이 Thread 에서는 출퇴근과 관련된 해쉬맵 3가지를 다룹니다.
 *  출퇴근 chul, 실시간출퇴근 chulG, 휴가관리 holy 의 세가지 해쉬맵입니다.
 *  모든 해쉬맵의 key 값은 사원번호이고, Value 값은 MemberData로 통일합니다.
 *  
 *  ProductMain 프로그램이 실행됨과 동시에 스레드가 작동하며, 작동되는 순간
 *  현재까지 저장된 BackUp Data를 불러오게 됩니다.
 *  이때 백업데이터에 저장된 날짜가 오늘의 날짜와 맞지않으면 
 *  1.데이터를 지우게 됩니다. or 2.오늘 해쉬맵으로 저장 or 3.새로운 날짜의 데이터생성.
 *  
 *  불러온 데이터의 날짜가 오늘이면 ProductMain 의 chulG 해쉬맵에 백업데이터를 저장해줍니다.
 *  
 *  
 *  Thread에서 하는 역할은 실시간 출퇴근 chulG의 사이즈를 매순간 측정하여 사이즈가 증가되었을시
 *  chulG 해쉬맵을 파일로 저장하여 데이터백업을 하도록합니다.
 *  기존 chulG 해쉬맵의 사이즈를 저장해놓을 temp가 있어야, 현재의 사이즈와 비교.
 *  
 *  
 *  출퇴근 chul 해쉬맵에 저장되는 logic
 *  1. 오후 5시가 되었을때, 출근한 사람은 자동으로 퇴근처리가 되도록 도와주고
 *  2. 출근하지 않은 사람중, 휴가를 쓴 사람은 휴가처리가 되도록 처리해주고,
 *   휴가가 사용되었을때, 해당 휴가 항목은 휴가 해쉬맵에서 삭제되도록 합니다.
 *  3. 출근하지 않은 사람중, 휴가도 사용하지 않았다면 무단 결근처리가 되도록 합니다.
 *  4. 모든 과정이 끝나면 해당 날짜의 chul 해쉬맵을 파일로 백업하여 줍니다.
 *  
 * 신규 Database 연동 내용 :
 *  기존 프로그램과 같이 오후 5시가 되면,
 *  사원의 입/퇴실 기록과 휴가기록을 가져와서 해당 날짜의 출/퇴근 기록을 만드는 Thread 입니다.
 *  
 *  프로그램 진행 로직
 *  1. 먼저 모든 사원의 id 정보를 가져와 chuldata 테이블에 해당날짜를 넣어주고, chultype을 0으로 초기화를 시켜줍니다.
 *  2. ChulHistory 테이블에서 해당 날짜의 입/퇴실 기록을 가져와 Memberid 를 distinct 로 구분하여 한번이라도 입/퇴실 기록이 있는 
 *  	사원들의 chultype을 1로 바꾸어 출근 기록으로 업데이트 해줍니다.
 *  3. 직원들의 휴가신청 DB인 holydata 정보를 가져와 해당 날짜에 누가 휴가를 사용하였는지 알아내고,
 *  	만약 휴가신청 기록(holytype) 이 1,2,3,4 인경우 chuldata 테이블에 chultype을 1로 바꾸어 줍니다.
 *  4. 만약 직원이 해당 날짜에 입/퇴실 기록이 없고, 휴가도 사용하지 않았다면 1번 과정에서 0으로 저장한 초기값이 그대로 남게 되어
 *      월급을 계산하지 못하게합니다.
 * 
 */


package product;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MemberThread extends Thread{

	ProductMain3 pm;
	MemberData md;	

	boolean tFlag=true;
	boolean fExist=false;
	boolean finish=false;
	boolean chulCheck=false;
	int oldSize;

	Date timeCheck;
	Date today = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); // file 저장용
	SimpleDateFormat timeC = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
	SimpleDateFormat checkToday = new SimpleDateFormat("yy-MM-dd");

	//데이터를 백업하기위한
	ObjectOutputStream send;
	ObjectInputStream receive;
	FileOutputStream fos;
	FileInputStream fis;	
	File f;

	// ProductMain에 있는 해쉬맵에 접근하기 위하여 생성될때 매개변수로 ProductMain 을 받아옵니다.
	public MemberThread(ProductMain3 p) {
		this.pm=p;		
		
		//스레드 시작
		this.start();
	}

	@Override
	public void run(){		
		while(tFlag){
			String now = timeC.format(new Date()); //시간 비교용
			String out = sdf.format(today) + " 17:00:00"; //출퇴근 기록 저장시간.

			//오후 5시가 되면 chulG -> chul 로 데이터를 구분합니다.
			//Thu May 08 12:38:40 KST 2014
			//20140508 12:38:40
			if(now.equals(out)){				
				makeDB();
			}						
		}
	}
	//DB저장 메서드
	public void makeDB(){
		
		//오늘 날짜 검색sql을 위한 simpledateformat
		SimpleDateFormat check = new SimpleDateFormat("yy/MM/dd");
		String today = check.format(new Date());
		
		try{
			Thread.sleep(1000);
			String sql2 = "select memberid from memberdata";
			PreparedStatement pstmt2 = pm.conn.prepareStatement(sql2);
			ResultSet rs2 = pstmt2.executeQuery();
			//우선 memberdata 에서 memberid 를 가져와 모든 사원의 해당 출석 및 휴가 여부를 모두 0으로 테이블에 저장한다.
			while(rs2.next()){
				String sql3 = "insert into chuldata values (chuldata_num.nextval, ?, sysdate, 0)";
				PreparedStatement pstmt3 = pm.conn.prepareStatement(sql3);
				pstmt3.setString(1, rs2.getString("memberid"));
				pstmt3.executeUpdate();
				pstmt3.close();
			}			
			//inouthistory 입/퇴실 기록을 이용하여 해당 날짜에 출퇴근 기록이 있는 직원은 1로 update
			//String sql = "select distinct memberid from inouthistory where his_time like '" + today +"%'";
			String sql = "select distinct memberid from inouthistory where to_char(his_time) like '%"+today+"%'";
			PreparedStatement pstmt = pm.conn.prepareStatement(sql);			
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()){				
				//resultset2 초기화
				rs2 = pstmt2.executeQuery();
				while(rs2.next()){
					if(rs.getString("memberid").equals(rs2.getString("memberid"))){
						String updateChul = "update chuldata set chultype=1 where memberid='"+rs.getString("memberid") +"' and chuldate like '%"+today+"%'";
						PreparedStatement chul_update = pm.conn.prepareStatement(updateChul);
						chul_update.executeUpdate();
						chul_update.close();
					}					
				}								
			}
			rs.close();
			pstmt.close();
			rs2.close();
			pstmt2.close();

			//휴가 쓴 직원 조회하여 Chuldata 테이블의 chultype=1로 변경, 만약 무급휴가이면 0으로. holytype 은 숫자형이므로 조건을 0 초과로.
			String holy_check = "select memberid, holydate, holytype from holydata where holydate like '%"+today+"%'";
			PreparedStatement hc = pm.conn.prepareStatement(holy_check);
			ResultSet hc_rs= hc.executeQuery();
			while(hc_rs.next()){
				if(hc_rs.getInt("holytype")>0){
					String holy_update = "update chuldata set chultype=1 where memberid='"+hc_rs.getString("memberid")+"' and chuldate like '%"+today+"%'";
					PreparedStatement holy_up = pm.conn.prepareStatement(holy_update);
					holy_up.executeUpdate();
					holy_up.close();
				}
			}
			hc_rs.close();
			hc.close();			
		}catch(Exception ex){
			ex.printStackTrace();
		}		
	}

}
